package main

import (
	"encoding/json"
	"gitee.com/sillyman/mixlog"
	"io/ioutil"
	"os"
	"strings"
)

var Conf = &Config{
	VLCBin:                     "/usr/bin/cvlc",
	SelectNetworkInterfaceName: "eth0",
	RTPStreamAddresses: []string{
		"239.9.9.1:5004",
		"239.9.9.2:5004",
	},
	VideoFiles: []string{
		"电影文件1.mp4",
		"电影文件2.mp4",
	},
}

//Config 定义配置文件
type Config struct {
	// VLCBin VLC的可执行文件路径（3.0版本或以上）
	// 如果是Linux系统，一般使用 cvlc，如：/usr/bin/cvlc
	VLCBin string

	// SelectNetworkInterfaceName 指定一个网络接口
	SelectNetworkInterfaceName string

	// RTPStreamAddresses RTP流的目标地址，写法：x.x.x.x:x，例如：239.9.9.1:5004
	// 有n个地址则发送n条视频流
	RTPStreamAddresses []string

	// VideoFiles 视频文件，依次且循环的对应到目标地址
	// 例如有3个视频文件，但是有5个目标地址，则第4个地址使用第1个视频文件，则第5个地址使用第2个视频文件。
	VideoFiles []string
}

// init 加载配置
func init() {
	const filename = "config.json"

	data, err := ioutil.ReadFile(filename)
	if err != nil {
		if os.IsNotExist(err) {
			mixlog.Error("配置文件不存在")

			data1, _ := json.MarshalIndent(Conf, "", "\t")
			if err := ioutil.WriteFile(filename, data1, 0644); err != nil {
				mixlog.Fatalf("生成默认的配置文件失败: %s", err.Error())
			}
			mixlog.Info("已在当前目录下生成了一个默认的配置文件，请按需修改，然后再次启动程序")

			os.Exit(1)
		}

		mixlog.Fatalf("不能读取配置文件: %s", err.Error())
	}

	if err := json.Unmarshal(data, &Conf); err != nil {
		mixlog.Fatalf("不能解析配置文件: %s", err.Error())
	}
	mixlog.Info("已经加载配置文件")

	Conf.VLCBin = strings.TrimSpace(Conf.VLCBin)

	// 检查配置要求
	if Conf.VLCBin == "" {
		mixlog.Fatal("没有设置 VLC 的可执行文件")
	}

	Conf.VideoFiles = cleanStrs(Conf.VideoFiles)
	if len(Conf.VideoFiles) == 0 {
		mixlog.Fatal("没有视频文件")
	}

	Conf.RTPStreamAddresses = cleanStrs(Conf.RTPStreamAddresses)
	if len(Conf.RTPStreamAddresses) == 0 {
		mixlog.Fatal("没有视频文件")
	}
}

// cleanStrs 清理空格和空值
func cleanStrs(strs []string) []string {
	newStrs := make([]string, 0, len(strs))
	for _, s := range strs {
		s = strings.TrimSpace(s)
		if s != "" {
			newStrs = append(newStrs, s)
		}
	}
	return newStrs
}
